﻿using Dlls;
using Persistencia;
using Persistencia.Tabelas;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;
using UI.Views.Consultas;
using XGerencial.Lancamentos.Pedido;

namespace UI.Lancamentos.Pedidos
{
    /// <summary>
    /// Interaction logic for frmPedido.xaml
    /// </summary>
    public partial class frmPedido : Window
    {
        private Context context;
        private Movimento movimento;
        private MovimentoDLL movimentoDll;
        private MovimentoItem movimentoItem;
        private MovimentoItemDLL movimentoItemDll;
        private PessoasDLL pessoaDll;
        private ProdutosDLL produtoDll;
        private Produto Produto;
        private List<MovimentoItem> listPedidoItems;
        private EstoqueDLL estoqueDll;
        private FormaPagamentoDLL fpagamentoDll;
        private decimal totalPedido = 0;
        private decimal qtdItemsPedido = 0;
        private int QtdProdutos = 0;
        private VendedorDLL vendedorDll;
        private EnderecoDLL enderecoDll;
        private AReceberDll areceberDll;

        public frmPedido()
        {
            context = new Context();
            movimento = new Movimento();
            movimentoDll = new MovimentoDLL();
            movimentoItem = new MovimentoItem();
            movimentoItemDll = new MovimentoItemDLL();
            pessoaDll = new PessoasDLL();
            listPedidoItems = new List<MovimentoItem>();
            Produto = new Produto();
            estoqueDll = new EstoqueDLL();
            produtoDll = new ProdutosDLL();
            fpagamentoDll = new FormaPagamentoDLL();
            vendedorDll = new VendedorDLL();
            enderecoDll = new EnderecoDLL();
            areceberDll = new AReceberDll();
            InitializeComponent();
        }

        private void InsertOrUpdate(object sender, RoutedEventArgs e)
        {
            try
            {
                if (txtNumeroPedido.Text == "")
                {
                    if (listPedidoItems.Count > 0)
                    {
                        movimento.CodigoPessoa = int.Parse(txtCodCliente.Text);
                        movimento.CodCaixaBanco = int.Parse(txtCodPagamento.Text);
                        movimento.VendedorComprador = int.Parse(txtCodVendedor.Text);
                        movimento.TipoMovimentacao = "Saida";
                        movimento.DataMovimentacao = DateTime.Now;
                        movimento.Total = Convert.ToDecimal(lblTotal.Content.ToString());
                        movimentoDll.Insert(movimento);

                        // Cria Conta a Receber Caso a Condição de Pagamento
                        var Return = fpagamentoDll.getFPagamento(int.Parse(movimento.CodCaixaBanco.ToString()));
                        if (Return.GeraFinanceiroSN == true)
                        {
                            areceberDll.InserirConta(Convert.ToDateTime(movimento.DataMovimentacao),Convert.ToDateTime( DateTime.Now), decimal.Parse(movimento.Total.ToString()), "TESTE",int.Parse( movimento.CodigoPessoa.ToString()),"1");
                        }
                        foreach (MovimentoItem item in listPedidoItems)
                        {
                            item.CodMovimento = movimento.Codigo;
                            item.TipoMovimento = Convert.ToChar("S");
                            decimal ValorTotal = Convert.ToDecimal(item.Quantidade * item.ValorUnitario);
                            context.MovimentosItems.InsertOnSubmit(item);
                            //movimentoItemDll.Insert(item);
                        }
                        context.SubmitChanges();
                        movimento = new Movimento();
                        listPedidoItems = new List<MovimentoItem>();
                        GridViewProdutos.ItemsSource = null;
                        MessageBox.Show("Pedido Criado com sucesso");
                        lblTotal.Content = "0,00";
                        lblItens.Content = "0,00";
                        Classes.LimpaCampos.reset(0, this);
                    }
                    else
                    {
                        MessageBox.Show("Não é possivel gravar um pedido sem itens");
                    }
                }
                else
                {
                    movimento.CodigoPessoa = int.Parse(txtCodCliente.Text);
                    movimento.CodCaixaBanco = int.Parse(txtCodPagamento.Text);
                    movimento.VendedorComprador = int.Parse(txtCodVendedor.Text);
                    movimento.DataMovimentacao = DateTime.Now;
                    movimento.Total = Convert.ToDecimal(lblTotal.Content.ToString());
                    movimentoDll.Update(int.Parse(txtNumeroPedido.Text), movimento);

                    foreach (MovimentoItem item in GridViewProdutos.ItemsSource)
                    {
                        decimal ValorTotal = Convert.ToDecimal(item.Quantidade * item.ValorUnitario);
                        movimentoItemDll.Update(item.CodMovimento, item);

                    }
                    movimento = new Movimento();
                    listPedidoItems = new List<MovimentoItem>();
                  //  GridViewProdutos.ItemsSource = null;
                    MessageBox.Show("Pedido Atualizado com sucesso");
                    Classes.LimpaCampos.reset(0, this);
                    lblTotal.Content = "0,00";
                    lblItens.Content = "0,00";
                }
            }
            catch (Exception)
            {
                MessageBox.Show("Registro não pode ser gravado/alterado, favor verificar o correto preenchimento dos campos");
            }

        }

        private void AdicionarProdutos(MovimentoItem items)
        {
            listPedidoItems.Add(items);
        }

        private void AdicionarItems(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                if (txtCodProduto.Text != "" && txtQtdProduto.Text != "")
                {
                   // Produto Produto = new Produto();
                    MovimentoItem pedidoItems = new MovimentoItem();
                    pedidoItems.CodProduto = int.Parse(txtCodProduto.Text);
                    pedidoItems.Quantidade = decimal.Parse(txtQtdProduto.Text);
                    pedidoItems.ValorUnitario = decimal.Parse(txtPrecoUnitario.Text);
                    pedidoItems.Produto = context.Produtos.FirstOrDefault(p => p.Codigo == pedidoItems.CodProduto);
                    AdicionarProdutos(pedidoItems);
                   // GridViewProdutos.ItemsSource = null;
                    GridViewProdutos.ItemsSource = listPedidoItems ;
                    
                    foreach (MovimentoItem item in listPedidoItems)
                    {
                        totalPedido += Convert.ToDecimal(item.ValorUnitario * item.Quantidade);
                        QtdProdutos += listPedidoItems.Count;
                        qtdItemsPedido += Convert.ToDecimal(item.Quantidade);
                    }

                    lblTotal.Content = totalPedido.ToString();
                    lblItens.Content = qtdItemsPedido.ToString();

                    totalPedido = 0;
                    QtdProdutos = 0;
                    qtdItemsPedido = 0;
                    txtCodProduto.Text = "";
                    txtNomeProduto.Text = "";
                    txtPrecoUnitario.Text = "";
                    txtPrecoTotal.Text = "";
                    txtQtdProduto.Text = "";
                    
                }
            }
        }

        private void BuscarCliente(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                if (txtCodCliente.Text != "")
                {
                    Pessoa pessoa = pessoaDll.getPessoa(int.Parse(txtCodCliente.Text));
                    ConsultaDadosClientes();
                    if (pessoa != null)
                    {
                        txtCodCliente.Text = pessoa.Codigo.ToString();
                        txtNomeCliente.Text = pessoa.Nome.ToString();
                    }
                    else
                    {
                        MessageBox.Show("Registro não encontrado");
                    }
                }
                else
                {
                    global.ReturnPessoa = null;
                    new frmConsultaPadrao("Pessoa").ShowDialog();
                    if (global.ReturnPessoa != null)
                    {
                        txtCodCliente.Text = global.ReturnPessoa.Codigo.ToString();
                        txtNomeCliente.Text = global.ReturnPessoa.Nome.ToString();
                    }
                }
            }
        }

        private void BuscarProduto(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                if (txtCodProduto.Text == "")
                {
                    global.ReturnProduto = null;
                    frmConsultaPadrao consulta = new frmConsultaPadrao("Produto");
                    consulta.ShowDialog();
                    if (global.ReturnProduto != null)
                    {
                        txtCodProduto.Text = global.ReturnProduto.Codigo.ToString();
                        txtNomeProduto.Text = global.ReturnProduto.Nome.ToString();
                        txtQtdProduto.Text = "1";
                        txtPrecoUnitario.Text = estoqueDll.GetEstoque(int.Parse(txtCodProduto.Text)).ValorVenda.ToString();
                    }
                }
                else if (txtCodProduto.Text != "")
                {
                    Produto produto = produtoDll.getProduto(int.Parse(txtCodProduto.Text));
                    Estoque estoque = estoqueDll.GetEstoque(int.Parse(txtCodProduto.Text));
                    if (produto != null)
                    {
                        txtCodProduto.Text = produto.Codigo.ToString();
                        txtNomeProduto.Text = produto.Nome.ToString();
                        txtQtdProduto.Text = "1";
                        if (estoque != null)
                        {
                            txtPrecoUnitario.Text = estoque.ValorVenda.ToString();
                        }

                    }
                    else
                    {
                        MessageBox.Show("Produto não encontrado");
                    }
                }
            }
        }

        private void CalcularTotal(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter || e.Key == Key.Tab)
            {
                decimal valorunitario = decimal.Parse(txtPrecoUnitario.Text);
                decimal quantidade = decimal.Parse(txtQtdProduto.Text);
                txtPrecoTotal.Text = Convert.ToString(valorunitario * quantidade);
            }

        }

        private void BuscarFormaPAgamento(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {

                if (txtCodPagamento.Text != "")
                {
                    Persistencia.FormaPagamento formapagamento = fpagamentoDll.getFPagamento(int.Parse(txtCodPagamento.Text));
                    if (formapagamento != null)
                    {
                        txtCodPagamento.Text = formapagamento.Codigo.ToString();
                        txtNomePagamento.Text = formapagamento.Descricao.ToString();
                    }
                    else
                    {
                        MessageBox.Show("Registro não encontrado");
                    }
                }
                else
                {
                    global.ReturFPagamento = null;
                    new frmConsultaPadrao("F Pagamento").ShowDialog();
                    if (global.ReturFPagamento != null)
                    {
                        txtCodPagamento.Text = global.ReturFPagamento.Codigo.ToString();
                        txtNomePagamento.Text = global.ReturFPagamento.Descricao.ToString();
                    }
                }
            }
        }

        private void EditarProdutoGrid(object sender, MouseButtonEventArgs e)
        {
            //int currentRow = GridViewProdutos.SelectedIndex;
            ////GridViewProdutos.ItemsSource = ItemsControl.;
            //GridViewProdutos.Items.RemoveAt(currentRow);
            ////(GridViewProdutos.SelectedItem );

            //GridViewProdutos.Items.Refresh();
            //int currentRow = GridViewProdutos.SelectedIndex;

            //listPedidoItems.RemoveAt(currentRow);

            //this.GridViewProdutos.ItemsSource = listPedidoItems;


        }

        private void BuscarVendedor(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                if (txtCodVendedor.Text != "")
                {
                    Vendedore vendedor = vendedorDll.getVendedor(int.Parse(txtCodVendedor.Text));
                    if (vendedor != null)
                    {
                        txtCodVendedor.Text = vendedor.CodVendedor.ToString();
                        txtNomeVendedor.Text = vendedor.NomeVendedor.ToString();
                    }
                    else
                    {
                        MessageBox.Show("Registro não encontrado");
                    }
                }
                else
                {

                    global.ReturnVendedor = null;
                    new frmConsultaPadrao("Vendedores").ShowDialog();
                    if (global.ReturnVendedor != null)
                    {
                        txtCodVendedor.Text = global.ReturnVendedor.CodVendedor.ToString();
                        txtNomeVendedor.Text = global.ReturnVendedor.NomeVendedor.ToString();
                    }
                }
            }
        }

        private void ConsultaDadosClientes()
        {
            Persistencia.Endereco endereco = enderecoDll.getEndereco(int.Parse(txtCodCliente.Text));
            Pessoa pessoa = pessoaDll.getPessoa(int.Parse(txtCodCliente.Text));
            if (endereco != null)
            {
                lblEndereco.Content = endereco.Logradouro.ToString();
                lblCidade.Content = endereco.Cidade.ToString();
                lblBairro.Content = endereco.Bairro.ToString();
                if (pessoa != null)
                {
                    lblContato.Content = pessoa.Contato.ToString();
                    lblEmail.Content = pessoa.Email.ToString();
                }

            }

        }

        private void EditarPedido(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                if (txtNumeroPedido.Text != "")
                {
                    Movimento movimento = movimentoDll.getMovimento(int.Parse(txtNumeroPedido.Text), "Saida");
                    if (movimento != null)
                    {
                        txtCodCliente.Text = movimento.CodigoPessoa.ToString();
                        txtNomeCliente.Text = pessoaDll.getPessoa(int.Parse(txtCodCliente.Text)).Nome;
                        txtCodVendedor.Text = movimento.VendedorComprador.ToString();
                        txtNomeVendedor.Text = vendedorDll.getVendedor(int.Parse(txtCodVendedor.Text)).NomeVendedor;
                        txtCodPagamento.Text = movimento.CodCaixaBanco.ToString();
                        txtNomePagamento.Text = fpagamentoDll.getFPagamento(int.Parse(txtCodPagamento.Text)).Descricao;
                        lblTotal.Content = movimento.Total.ToString();
                        GridViewProdutos.ItemsSource = movimentoItemDll.List(movimento.Codigo);
                    }
                    else
                    {
                        MessageBox.Show("Não registros com o código informado");
                    }
                }
            }
        }

        private void RecalcularProdutos(object sender, SelectedCellsChangedEventArgs e)
        {
            foreach (MovimentoItem item in GridViewProdutos.ItemsSource)
            {
                totalPedido += Convert.ToDecimal(item.ValorUnitario * item.Quantidade);
                QtdProdutos += listPedidoItems.Count;
                qtdItemsPedido += Convert.ToDecimal(item.Quantidade);
            }

            lblTotal.Content = totalPedido.ToString();
            lblItens.Content = qtdItemsPedido.ToString();
            totalPedido = 0;
            QtdProdutos = 0;
            qtdItemsPedido = 0;
        }

        private void Exportar(object sender, RoutedEventArgs e)
        {
            frmImportarPedido frm = new frmImportarPedido();
            frm.ShowDialog();
        }
    }
}
